package com.gxstnu.controller;

import cn.hutool.core.io.FileUtil;
import com.gxstnu.common.Result;
import com.gxstnu.exception.CustomerException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.net.URLEncoder;

@RestController
@RequestMapping("/files")
public  class FileController {

    /**
     * 文件上传接口
     * 上传路径："http://localhost:8848/files/upload"
     */
    @PostMapping("/upload")
    public Result upload(@RequestParam("file") MultipartFile file) throws Exception {
        // 1. 获取文件的位置
        String filePath = System.getProperty("user.dir") + "/files/" ;
        // 2. 判断文件夹是否存在
        if(!FileUtil.isDirectory(filePath)){
            // 若不存在则 创建文件夹
            FileUtil.mkdir(filePath);
        }
        byte[] bytes = file.getBytes();//3.获取文件字节流
        String Filename = System.currentTimeMillis() + "_" + file.getOriginalFilename();//文件名+时间戳
        FileUtil.writeBytes(bytes, filePath+Filename);//4.将文件字节流写入文件
        String url = "http://localhost:8848/files/download/" + Filename;
        return Result.success(url);
    }


/**
 * 文件下载接口
 * @param fileName 文件名
 * @param response 响应对象
 * 下载路径："http://localhost:8848/files/download/1.txt"
 */
    @GetMapping("/download/{fileName}")
    public  void download(@PathVariable String fileName, HttpServletResponse response) throws Exception {
        // 1. 获取文件的绝对路径
        String filePath = System.getProperty("user.dir") + "/files/" + fileName;
        // 2. 创建文件对象
        File file = new File(filePath);
        // 3. 判断文件是否存在
        if (!file.exists()) {
            throw new CustomerException("文件不存在");
        }
        //4.读取文件字节流
        byte[] bytes = FileUtil.readBytes(filePath);
        ServletOutputStream outputStream = response.getOutputStream();//获取输出流
        //输出流对象把文件写出到客户端
        outputStream.write(bytes);//将字节流写入输出流
        outputStream.flush();//刷新输出流
        outputStream.close();//关闭输出流
    }
}
